package cn.good.yan.controller;

import cn.good.yan.pojo.Bill;
import cn.good.yan.service.BillServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 演示 - 缓存
 * 缓存cache
 *      设置缓存注解 @Cacheable
 *      更新缓存    @CachePut
 *      清理缓存    @CacheEvict
 *      CacheController controller = new CacheController();
 * @author shengren.yan
 * @create 2023-09-20
 */
@RestController
@RequestMapping("/cache")
public class BillController {

    @Autowired
    private BillServiceImpl billService;

    /**
     * 查询
     *
     * @return {@link List}<{@link Bill}>
     */
    @GetMapping("/list")
    public Bill list() {
        // 第1次，请求该接口，会查询数据库
        // 第2次，请求该接口，不会查询数据
        Bill byBid = billService.getById(6L);
        return byBid;
    }

    /**
     * 查询
     *
     * @return {@link List}<{@link Bill}>
     */
    @GetMapping("/list2")
    public Bill list2() {
        // 第1次，请求该接口，会查询数据库 ， 与  list 上一个方法请求，不是同一个key（不是同一个数据），会查数据库
        // 第2次，请求该接口，不会查询数据
        Bill byBid = billService.getById(7L);
        return byBid;
    }

    /**
     * 修改
     *
     * @return {@link List}<{@link Bill}>
     */
    @GetMapping("/update")
    public Bill update() {
        // 会更新数据库里值，再同步到缓存中 ，
        // 再执行上一个方法，不会查询数据库，已更新了缓存中的值
        // 注意：如果缓存中没有值，更新后的值，也会缓存，再一次查询，不会走数据库
        Bill billVo = new Bill();
        billVo.setBid(6L);
        Bill bill = billService.updateById(billVo);
        return bill;
    }

    /**
     * 删除
     *
     * @return {@link List}<{@link Bill}>
     */
    @GetMapping("/delete")
    public String delete() {
        // 清空缓存中全部的数据，所有查询再查询数据库
        billService.deleteById(6L);
        return "ok";
    }

}

